{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型训练流程"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 数据准备\n",
    "    - 数据探索<br>\n",
    "    train训练集下有100个目录，每个目录代表一个汉字，目录下有不同该字的书法\n",
    "    test测试集一级目录下包含不同汉字的图片\n",
    "    所有图片为单通道，宽高不一致的图片\n",
    "    - 数据筛选<br>\n",
    "    数据已经清理过，没有无效的数据\n",
    "    - 预处理(集成在训练过程中)\n",
    "    - 打包<br>\n",
    "    tensorflow支持tfrecord格式的数据转换，好处是我们可以把很多小文件打包成大文件，提高磁盘读取效率。<br>\n",
    "    打包命令及结果如下图所示：\n",
    "    <img src=\"./images/数据打包.jpg\">\n",
    "    数据集切分为训练集30000张图片，验证集10000张图片\n",
    "* 训练/调参\n",
    "    - 首先下载在imagenet上预训练的inception_v3的文件\n",
    "    - 将数据集和代码文件复制到GPU机器上\n",
    "    - 指定模型训练参数：包括训练文件名(train_image_classifier.py)，数据集名称(quiz)，数据集目录(./train)，预训练模型(inception_v3.ckpt)，训练模型(inception_v3)，需排除参数的命名空间(由于ImageNet上的分类有1000个输出，而本次汉字书法识别任务有100个输出，因此需要丢弃掉一些权重，这些权重所在命名空间为InceptionV3/Logits,InceptionV3/AuxLogits)，记录summary文件目录(./train)，学习率(finetune一个模型的时候，由于参数初始为比较好的状态，因此学习率设置小一点，为0.001)，优化器(rmsprop)，batch_size(这里设置一次输入32张图片)。<br>\n",
    "    下图为训练过程中输出的信息：\n",
    "    <img src=\"./images/模型训练.jpg\">\n",
    "    从图中看出每一次训练耗时大约1.1s，完成一个epoch大约需要30000/32*1.1/60 = 17min\n",
    "* 验证\n",
    "    - 开启另一个终端连接实验室服务器，同时进行训练和验证，当验证的准确率和召回率都比较高时就停止训练。由于GPU的显存几乎都用于模型训练了，因此通过export CUDA_VISIBLE_DEVICES=\"\"命令来使用CPU进行验证\n",
    "    - 参数：验证文件(eval_image_classifier.py)，数据集名称(quiz)，数据集目录(./train)，dataset_split_name(validation)，训练模型(inception_v3)，验证模型(./train下的保存的最新的ckpt文件)，验证时summary写入目录(./eval)，batchsize(一次输入32张图片)，max_num_batch(在验证时由于验证集也比较大，我们可以不使用全部数据，可以指定最大的batch数，这里指定为128.因此验证的数据为128*32=4096张图片，差不多半个数据集做验证)\n",
    "    - 下图为验证训练23901歩保存的模型：\n",
    "    <img src=\"./images/模型验证.png\">\n",
    "    Top1(Accuracy)达到了93%以上，Top5(Recall)达到了98%以上，模型效果非常好。\n",
    "* 模型导出\n",
    "* 模型使用"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### tensorboard解读"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 损失函数\n",
    "<img src=\"./images/tensorboard-losses.jpg\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从损失函数看，后面损失波动有点大，出现了一点点回升，学习率可以设置得再小一些，模型还未收敛，继续训练，损失还有减小的余地。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 模型稀疏度\n",
    "<img src=\"./images/tensorboard-sparsity.jpg\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "稀疏度在上升，说明模型系数变得稀疏，模型越来越简单，说明模型泛化能力越强。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* graph\n",
    "<img src=\"./images/tensorboard-graph.png\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "展现了inception_v3的图结构以及反向传播的图结构。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
